package org.ncibi.cytoscape.metscape.data;

import java.util.List;
import java.util.Map;

import cytoscape.Cytoscape;
import cytoscape.data.CyAttributes;
import cytoscape.data.attr.MultiHashMap;
import cytoscape.data.attr.MultiHashMapDefinition;

public class Attributes {
	public static Attributes node = new Attributes(Cytoscape.getNodeAttributes());
	public static Attributes edge = new Attributes(Cytoscape.getEdgeAttributes());
	public static Attributes network = new Attributes(Cytoscape.getNetworkAttributes());

	private CyAttributes cyAttr;
	
	public Attributes(CyAttributes cyAttr) {
		this.cyAttr = cyAttr;
	}
	
	public boolean deleteAttribute(String id, String attributeName) {
		return cyAttr.deleteAttribute(id, attributeName);
	}
	
	public boolean deleteAttribute(String attributeName) {
		return cyAttr.deleteAttribute(attributeName);
	}
	
	public Object getAttribute(String id, String attributeName) {
		return cyAttr.getAttribute(id, attributeName);
	}
	
	public String getAttributeDescription(String attributeName) {
		return cyAttr.getAttributeDescription(attributeName);
	}
	
	public String[] getAttributeNames() {
		return cyAttr.getAttributeNames();
	}
	
	public Boolean getBooleanAttribute(String id, String attributeName)
	throws ClassCastException {
		return cyAttr.getBooleanAttribute(id, attributeName);
	}

	public Double getDoubleAttribute(String id, String attributeName)
	throws ClassCastException {
		return cyAttr.getDoubleAttribute(id, attributeName);
	}

	public Integer getIntegerAttribute(String id, String attributeName)
	throws ClassCastException {
		return cyAttr.getIntegerAttribute(id, attributeName);
	}

	public String getStringAttribute(String id, String attributeName)
	throws ClassCastException {
		return cyAttr.getStringAttribute(id, attributeName);
	}
	
	public List<?> getListAttribute(String id,
			String attributeName) throws ClassCastException {
		return cyAttr.getListAttribute(id, attributeName);
	}

	public Map<?,?> getMapAttribute(String id, String attributeName)
	throws ClassCastException {
		return cyAttr.getMapAttribute(id, attributeName);
	}
	
	public MultiHashMap getMultiHashMap() {
		return cyAttr.getMultiHashMap();
	}
	
	public MultiHashMapDefinition getMultiHashMapDefinition() {
		return cyAttr.getMultiHashMapDefinition();
	}
	
	public byte getType(String attributeName) {
		return cyAttr.getType(attributeName); 
	}
	
	public boolean getUserEditable(String attributeName) {
		return cyAttr.getUserEditable(attributeName);
	}
	
	public boolean getUserVisible(String attributeName) {
		return cyAttr.getUserVisible(attributeName);
	}

	public boolean hasAttribute(String id, String attributeName) {
		return cyAttr.hasAttribute(id, attributeName); 
	}

	public void setAttribute(String id, String attributeName, Boolean value)
	throws IllegalArgumentException {
		if (value != null) {
			cyAttr.setAttribute(id, attributeName, value);
		}
		else {
			if(cyAttr.hasAttribute(id, attributeName))
				cyAttr.deleteAttribute(id, attributeName);
		}
	}

	public void setAttribute(String id, String attributeName, Double value)
	throws IllegalArgumentException {
		if (value != null){ 
			cyAttr.setAttribute(id, attributeName, value);
		}
		else {
			if(cyAttr.hasAttribute(id, attributeName))
				cyAttr.deleteAttribute(id, attributeName);
		}
	}

	public void setAttribute(String id, String attributeName, Integer value)
	throws IllegalArgumentException {
		if (value != null) {
			cyAttr.setAttribute(id, attributeName, value);
		}
		else {
			if(cyAttr.hasAttribute(id, attributeName))
				cyAttr.deleteAttribute(id, attributeName);
		}
	}

	public void setAttribute(String id, String attributeName, String value)
	throws IllegalArgumentException {
		if (value != null){ 
			cyAttr.setAttribute(id, attributeName, value);
		}
		else {
			if(cyAttr.hasAttribute(id, attributeName))
				cyAttr.deleteAttribute(id, attributeName);
		}
	}

	public void setListAttribute(String id, String attributeName, List<?> list)
	throws IllegalArgumentException {
		if (list != null){ 
			cyAttr.setListAttribute(id, attributeName, list);
		}
		else {
			if(cyAttr.hasAttribute(id, attributeName))
				cyAttr.deleteAttribute(id, attributeName);
		}
	}

	public void setMapAttribute(String id, String attributeName, Map<?,?> map)
	throws IllegalArgumentException {
		if (map != null) { 
			cyAttr.setMapAttribute(id, attributeName, map);
		}
		else {
			if(cyAttr.hasAttribute(id, attributeName))
				cyAttr.deleteAttribute(id, attributeName);
		}
	}
	
	public void setAttributeDescription(String attributeName, String description) {
		cyAttr.setAttributeDescription(attributeName, description);
	}
	
	public void setUserVisible(String attributeName, boolean value){
		cyAttr.setUserVisible(attributeName, value);
	}

	public void setUserEditable(String attributeName, boolean value){
		cyAttr.setUserEditable(attributeName, value);
	}

	
	
}
